package top.lshaci.learning.hutool;

import cn.hutool.core.collection.IterUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.date.TimeInterval;
import cn.hutool.extra.tokenizer.Result;
import cn.hutool.extra.tokenizer.TokenizerEngine;
import cn.hutool.extra.tokenizer.TokenizerUtil;
import cn.hutool.extra.tokenizer.Word;

import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import static java.util.stream.StreamSupport.stream;

/**
 * TokenizerEngineUtil
 *
 * <pre>
 *     <dependency>
 *         <groupId>org.ansj</groupId>
 *         <artifactId>ansj_seg</artifactId>
 *         <version>5.1.1</version>
 *     </dependency>
 * </pre>
 *
 * @author lshaci
 * @since 1.0.0
 */
public class TokenizerEngineUtil {

    public static void main(String[] args) {
        //自动根据用户引入的分词库的jar来自动选择使用的引擎
        TokenizerEngine engine = TokenizerUtil.createEngine();
        System.err.println(engine);
        //解析文本
        String text = "这两个方法的区别在于返回值";
        TimeInterval timer = DateUtil.timer();
        Result result = engine.parse(text);
        //输出：这 两个 方法 的 区别 在于 返回 值
        System.err.println(timer.intervalPretty());
        String resultStr = IterUtil.join((Iterator<Word>) result, " ");
        System.err.println(resultStr);

        String[] strs = {
                "冲收自动化学院百利兵投标保证金9/1",
                "付中化国际招标有限责任公司上海分公司投标保证金9/1",
                "基础与前沿研究院赵辉报专用材料费",
                "机械与电气工程学院石蓝富报网络通讯费",
                "科学技术发展研究院王静报工程装修等",
                "基础与前沿研究院赵辉报专用材料费",
                "人事处黄杜鹃交1月省社保门诊补充医疗保险",
                "G072018YFB0106100提留管理费",
                "G072018YFB0106100提留院校科研管理费",
                "代扣中国电子科技集团公司第十研究所印花税",
                "基础与前沿研究院赵辉报专用材料费",
                "201812Q3533收中国人民解放军63839部队到款2018-12-03增普02757377(4万)"
        };
        timer.restart();
        Map<String, Long> collect = Arrays.stream(strs)
                .distinct()
                .flatMap(s -> stream(engine.parse(s).spliterator(), true).map(Word::getText))
                .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
        System.err.println(timer.intervalPretty());
        System.err.println(collect);
    }
}
